ShowTable of Contents
はじめに
JMeter は Apache プロジェクトで提供されている Web アプリケーションのパフォーマンス測定や負荷テストに使用されるツールです。Domino アプリケーション、もちろん XPages アプリケーションでも、そのテストにパワフルに使用できます。JMeter を使用しての XPages アプリケーションのテストについて、すでに Wiki 記事「JMeterを使ってXPagesアプリケーションのパフォーマンステストを行う際の考慮点」で解説されています。しかし Apache JMeter 自体が少しわかりにくいところがあるので、XPages アプリケーション開発者向けにこの記事を書きました。
JMeter は Apache のページからダウンロードできます。この執筆時の最新版である 2.11 を基にこの記事を書いています。
JMeter の使用には JRE 6.0 以降が必要です。あらかじめインストールしておきます。
JMeter のページから apache-jmeter-2.11.zip をダウンロードし、適当なフォルダに展開します。ここでは c:\ 直下に展開し C:\apache-jmeter-2.11\ が作成されたことにしています。実行時に起動フォルダにログが作成されるので。log フォルダを作ってそこで実行すると良いです。
以下のようにコマンドラインから起動します。
C:\Users\test> cd \apache-jmeter-2.11\log
C:\apache-jmeter-2.11\log> c:\apache-jmeter-2.11\bin\jmeter.bat
|
JMeter のテストを構成する部品
JMeter を最初に起動すると、すでに「テスト計画」と「ワークベンチ」があります。ここにさまざま部品を追加してテストシナリオを作成します。
JMeter のテストを構成する部品をまとめます。
カテゴリ |
エレメント名
|
|
|
テスト計画(Test Plan)
|
JMeterで実施するテストの部品をまとめるルートとなる部品です。
|
|
ワークベンチ(WorkBench)
|
JMeter のテスト部品を仮置きする場所で、コピー&ペーストに使ったりなど目的に応じして使用できます。「テスト計画」を保存するときには「ワークベンチ」は保存されないので、必要に応じて個別に保存する必要があります。 |
スレッド (Threads(Users)) |
|
|
スレッドグループ(Thread Group)
|
実行するテストケースを取りまとめたもので、テスト実行時に起動するスレッドの数で複数ユーザーからのアクセスをシュミレートします。「スレッド数」が同時アクセスユーザー数で、「Ramp-up 時間」によってそれらのスレッドがすべて起動されるまでの時間を指定します。スレッドグループの設定で、テストを一定数行って終了するか、無限に行うかも設定できます。 |
サンプラー(Sampler) |
|
|
HTTPリクエスト
(HTTP Request)
|
HTTP/HTTPS のリクエストを Web サーバーに送信する「サンプラー」です。個々の HTTP リクエストでプロキシサーバーにを使用するよう設定できます。「Embedded Resource from HTML Files」の設定で、レスポンスに含まれる HTML をパーズし、埋め込まれたイメージやその他のリソースを取得するように設定することもできます。 |
リスナー(Listener) |
|
|
結果を表で表示
(View Results in Table)
|
個々のテストサンプルの結果を1行として視覚化して表示するビジュアライザーです。このビジュアライザーはメモリの消費が大きいらしいです。
|
|
結果をツリーで表示
(View Results Tree)
|
テストサンプルの結果をツリー形式で表示するビジュアライザーです。テストサンプルに対するレスポンスとともにレスポンス時間やレスポンスコードを表示します。 |
|
応答をファイルへ保存
Save Responses to a file
|
この部品は「テスト計画」のどこにでも配置することができ、スコープ内の「サンプラー」の実行で、応答データのファイルを作成します。この部品は機能テストを作成する際に使用されることが多く、「結果をツリーで表示」などで表示しきれない大きなレスポンスを扱うのに適しています。 |
設定エレメント(Configuration Element) |
|
|
HTTPクッキーマネージャー(HTTP Cookie Manager)
|
クッキーマネージャには2つの機能があります。
ひとつは Web ブラウザのようにクッキーを保持してサーバーに送信する機能です。HTTP リクエストのレスポンスにクッキーが含まれていれば、そのクッキーはクッキーマネージャによって自動的に保存され、そのWebサイトへの今後のリクエストで使用されます。JMeterのそれぞれのスレッドは独自のクッキー保持エリアを持ちます。テストをしているWeb サイトのセッションをクッキーで保持していても、各JMeterスレッドは独立したセッションを持ちます。
ふたつめは、クッキーマネージャに手動でクッキーの追加をすることができます。しかしこの場合は追加したクッキーがすべてのJMeterのスレッドで共有されます。
|
|
HTTP認証マネージャ(HTTP Authorization Manager) |
HTTP認証マネージャによって、アクセスに認証が必要な Web ページに対するログインユーザーをひとつまたは複数指定することができます。アクセスの制限されたページにブラウザからアクセスしたときには、ブラウザはログインダイアログを表示します。JMeterではこのようなページに遭遇すると、あらかじめ用意されたログイン情報を送信します。 |
タイマ(Timer) |
|
|
定数タイマ(Constant Timer) |
「スレッド」内の各サンプラーの実行間隔をミリ秒で指定する「タイマ」です。置かれた「スレッド」や「コントローラ」にあるすべての「サンプラー」の実行時にこの「定数タイマ」による一時停止が発生します。 |
|
定数スループットタイマ(Constant Throughput Timer) |
1分あたりのサンプラーの発生回数を制御する「タイマ」です。置かれた「スレッド」内で可能な限り、指定されたスループットを維持するようにリクエストを生成します。スレッドを複数生成したときには、スレッド数だけスループットが増加します。生成されるスループットは、サーバーの応答時間の遅れなどで変わることがあります。 |
ここでは記事で使用する部品のみを記載しました。その他の部品や詳細な情報は JMeter のヘルプを参照してください。
テストシナリオ
「テスト計画」にテストシナリオを作成しながら、これらの部品の使い方を解説します。
スレッドグループ
最初に起動したときには「テスト計画」と「ワークベンチ」だけが定義されています。この「テスト計画」を右クリックし「追加」→「Threads(Users)」→「スレッドグループ」を選択して「スレッドグループ」を作成します。「スレッドグループ」はテストの実行を制御するエレメントで、複数のユーザーからのアクセスをシュミレートするために複数のスレッドを立ち上げてテストを実行することができます。
パラメータ
|
説明 |
名前(Name)
|
この「スレッドグループ」を表す名前 |
スレッド数
(Number of Threads)
|
シュミレーションするユーザー数 |
Ramp-up期間
(Ramp-up Period)
|
すべての「スレッド」が開始されるまでに要する時間。もし10スレッドでRamp-up期間として100秒が指定されたときは、直前の「スレッド」の開始から10秒で次の「スレッド」が開始され、すべての「スレッド」がすべてそろうまでに100秒かかります。 |
ループ回数(Loop Count) |
テストシナリオを繰り返す回数を指定します。「無限ループ」を選択することで、手動で停止するまで実行し続けます。
|
ここでは試験的に以下のよう設定をします。
|
スレッド数: |
3 |
|
Ramp-up 期間(秒): |
5 |
|
ループ回数: |
1 |
HTTPリクエスト
「スレッドグループ」内に実際にテストを行う HTTP リクエストを記載します。「スレッドグループ」を右クリックして「追加」→「サンプラー」→「HTTPリクエスト」を選択し、「HTTPリクエスト」を作成します。ユーザーの操作の際に発生する HTTP リクエストの URL や送信データなどを 「HTTP リクエスト」に定義します。
カテゴリ |
パラメータ |
説明 |
|
名前(Name) |
この「サンプラー」を示す名前
|
Webサーバー |
|
|
サーバーまたは IP |
Webサーバーのドメイン名または IP アドレス |
|
ポート |
Webサーバーが開いているポート(デフォルト:80) |
HTTPリクエスト |
|
|
プロトコル |
HTTP、HTTPS またはFILE(デフォルト: HTTP) |
|
メソッド |
GET, POST, HEAD, TRACE, OPTIONS, PUT, DELETE, PATCH (JAVA implementationで非サポート) |
|
パス |
アクセスするリソースのパス(例:/servlets/myServlet)を指定します。リソースにURLパラメータを指定するときには「Parameter」タブの「リクエストで送るパラメータ」に指定します。
「http://」や「https://」から指定したときは完全なURLとして扱われ、「ポート」や「プロトコル」の設定値は無視されます。
|
Proxy Server |
|
|
Server (proxy) |
リクエストを処理するプロキシサーバーのホスト名や IP アドレスを指定します。「http://」などは指定しません。 |
|
Port |
プロキシサーバーでの待受けポートを指定します。 |
|
Username |
(オプション)プロキシサーバーのユーザー名 |
|
Password |
(オプション)プロキシサーバーのパスワード(この値はテスト計画に暗号化されずに保存されます)
|
ここでは試験的に以下のよう設定をします。
|
名前: |
developerWorks ページアクセス |
|
サーバー名: |
www.ibm.com |
|
メソッド: |
GET |
|
パス: |
/developerworks/jp/ |
これでテストを実施することができますが結果の表示ができません。次に実行結果を表示するリスナーを追加します。
結果を表で表示
「テスト計画」を右クリックして「リスナー」→「結果を表で表示」を選択します。「結果を表」で表示を追加したら、アクションバーから「開始」ボタンを押してテストを実行します。テストは「スレッドグループ」の定義に従って実行されます。
3つのスレッドが起動され、それぞれ1回ずつ処理を行って終了しています。Ramp-upを3秒と指定しているので、約3秒かけてすべてのレッドが起動されました。
応答をファイルへ保存
結果を表で表示しただけでは、そのリクエストに対して正しいレスポンスが来ているかどうかわかりません。そのときは「テスト計画」を右クリックして「リスナー」→「応答をファイルへ保存」を選択します。
応答をファイルへ保存では「ファイル名の接頭辞」を指定します。これで各HTTPリクエストのレスポンスがこの接頭辞つきの連番ファイル名で保存されます。デフォルトの保存場所は JMeter を起動したフォルダです。これはHTTP レスポンスのデータタイプによって HTML ファイルであったり画像などのバイナリファイルで保存されます。テスト計画の作成時においてはこのファイルの内容を確認して、テストが正しく実行されていることを確認します。
XPages アプリケーションへのアクセスをテスト
次に XPages アプリケーションへのアクセスを試してみましょう。サーバー nd90la.lotus.con にディスカッションテンプレートを使用した discussion.nsf があるとします。ACL でのアクセス制限がされていなければ、先の developerWorks のページへのアクセスと同様に http://nd90lab.lotus.com/discussion.nsf へのHTTPリクエストを作成すればアクセスはできます。しかしアクセス制御されている場合には、認証をを行う必要があります。
最初に Domino サーバーの Domino Webエ ンジンで特に設定をしていない場合、つまり基本認証の場合について紹介します。次に Domno Web エンジンで「セッション認証」が指定され認証フォームyが表示される場合を紹介します。
HTTP認証マネージャ
HTTP リクエストが Domino アプリケーションにアクセスするために以下のように書き換えます。
|
名前: |
ディスカッションアプリ |
|
サーバー名またはIP: |
nd90lab.lotus.com |
|
パス: |
/discussion.nsf |
ACL で Anonymous のアクセス制限されている Domino アプリケーションにアクセスとすると、「エラー 401、この操作を実行する権限がありません 」が表示されます。DominoサーバーのWebエンジンが基本認証で Web ページにアクセスするのであれば「HTTP 認証マネージャ」を追加して認証設定ができます。
スレッドグループを右クリックして「認証エレメント」→「HTTP 認証マネージャ」を追加します。「HTTP 認証マネージャ」の「認証マネージャに保存されている認証」のセクションのの一番下にある「追加」ボタンを押して行を追加し、以下の値を設定します。
|
基底URL: |
[{{http://nd90lab.lotus.com}}} |
※省略可能 |
|
ユーザー: |
アプリケーションにアクセスできるユーザー |
|
|
パスワード: |
ユーザーのパスワード |
|
設定ができたら「テスト計画」を実行します。
「認証マネージャ」が正しく設定されていれば、Domino アプリケーションへのアクセスが成功し、「結果を表で表示」でも Status に「Success」で表示されます。「応答をファイルへ保存」で保存されたファイルを開くと、アプリケーションの内容を正しく表示しているはずです。なおダウンロードされたHTMLファイルをブラウザで開くと「All Documents」ビューの文書の一覧が含まれていますが、画像などが切れていて画面が崩れていると思います。通常のブラウザではページに埋め込まれた画像・ Javascript・CSS といったものを自動でダウンロードしてページを構成してくれますが、JMeter のデフォルト設定で は「HTTP リクエスト」に記載されたURLのリソースしかダウンロードしません。そのためサーバーアクセスを厳密に再現するためには、こういった部品もダウンロードするよう 「HTTPリクエス ト」で「すべてのイメージとアプレットを繰り返しダウンロードする(HTML ファイルのみ)」を選択する必要があります。
セッション認証とHTTPクッキーマネージャー
Domino Webエンジンでセッション認証が有効になっているときの認証方法を見てみましょう。Domino Web エンジンで Web サイト文書のセッション認証を設定する方法は Domino のヘルプ文書に記載されています。
このときは、先ほど追加した「HTTP認証マネージャは」使用しないので削除します。認証は http://nd90lab.lotus.com/names.nsf?Login に POST リクエストでユーザー名とパスワードを送信することで行います。そこで先ほど追加した「ディスカッションアプリ」の直前に「HTTPリクエスト」を追加し、以下のように設定します。
|
名前: |
ログイン |
|
サーバー名またはIP: |
nd90lab.lotus.com |
|
メソッド: |
POST |
|
パス: |
/names.nsf?Login
|
|
Parameters: |
「追加」ボタンを2回押して、以下のパラメータを追加します。 |
|
username: |
admin (アプリケーションにアクセスできるユーザー) |
|
password: |
passw0rd (ユーザーのパスワード) |
この「ログイン」処理での認証情報をクッキーに保持して、次の「ディスカッションアクセス」で使用します。「スレッドグループ」を右クリックして認証エレメント」→「HTTP クッキーマネージャ」を追加します。ここでは「HTTP クッキーマネージャ」を追加するだでけで特別な設定は必要はありません。
ブラウザからのリクエストの録画
これ以上複雑な処理をテストシナリオに直接作成するのは限界があります。そこで実際のブラウザ操作で発生するクライアントリクエストを録画してテストシナリオに取り込む仕組みが JMeter には用意されています。
「ワークベンチ」を右クリックし、「Non-Test エレメント」→「HTTP プロキシーサーバー」を追加します。「Global Settings」の「ポート」が 8080 になっているので、JMeter を実行している PC でこのポートが使用されていないことを確認します。その他の設定を変更する必要はありませんが、以下の設定をすることを推奨します。
|
対象となるコントローラ: |
ワークベンチ > HTTPプロキシサーバ |
|
グループにする: |
新既コントローラへ各グループを置く |
「対象となるコントローラー」は、録画されたサンプラーがおかれる場所です。デフォルトの設定ですと「記録コントローラ」の中に置かれてしまいます。あらかじめ「記録コントローラ」を作っておかないと、作成中のテストシナリオと混ざってしまったりして混乱する可能性があります。上記のように選択することで「ワークベンチ」の中に録画されたサンプラーが置かれます。
「グループにする」を選択することで、ブラウザからの一回のリクエストで発生する複数の「HTTP リクエスト」を「シンプルコントローラー」にまとめてくれます。この設定をしないとすべてのサンプラーがフラットに置かれるために、後で整理するのが大変になります。
一番下の「開始」ボタンを押すと JMeter が HTTP プロキシとして動作し、経由したリクエストを記録します。Root CA Certificate に関するダイアログが出るので「OK」を押します。
ブラウザでプロキシの設定をします。Internet Explorer の場合、メニューから「ツール」→「インターネットオプション」を選択し、ダイアログで「接続」タブを開き「LAN 接続設定」をクリックします。「ローカルエリアネットワーク(LAN)の設定」ダイアログで「プロキシーサーバー」セクションの「LANにプロキシサーバーを使用する」を選択し、以下の値を設定して「OK」を押してダイアログを閉じます。
|
アドレス: |
localhost |
|
ポート: |
8080 |
これでブラウザからの操作がすべてJMeterに記録されます。
以下の画面では、次の4ステップの操作を行ったときのHTTPリクエストを記録しています。
-
アプリケーションの URL を開示してログイン画面の表示
-
ログイン画面での認証を経て文書一覧の表示
-
文書の一覧での文字列での検索
-
文書の一覧から既存の文書の開示
ブラウザでの操作に応じて発生する「HTTP リクエスト」が記録され、「HTTP プロキシ」 の配下に追加されます。先ほどのパラメータの設定でそれぞれのブラウザ操作に関連する 「HTTP リクエスト」が「シンプルコントローラー」でグループ化されています。
グループの中をみてみると、ユーザーひとつの操作でページ自体の取得の他に、ページに埋め込まれた画像・CSS・Javascriptといったリソースの取得が行われ、複数の「HTTP リクエスト」が発生しています。またそれぞれの「HTTP リクエスト」にブラウザで生成された HTTP ヘッダ情報を保持する「HTTP ヘッダマネージャ」が生成されているので、ブラウザからのアクセスをより正確に再現するために役立ちます。
ここで記録された 「HTTP リクエスト」をテストシナリオとして使うには、これらの記録された「HTTP リクエスト」を作成中の「スレッドグループ」にコピーします。今回は XPages を呼び出している「HTTP リクエスト」をテスト計画に取り込みます。
さらに複雑なテストシナリオの作成のために
XPages アプリケーション操作のためのビュー ID の保持
XPagesアプリケーションでは記録されたシナリオをそのまま使用することができますが、処理の内容によっては想定した通りの動作をしないことがあります。それはビュー ID で XPages アプリケーションの処理を管理しているためです。この問題については、以下のWik i記事に詳細が記載されています。
JMeterを使ってXPagesアプリケーションのパフォーマンステストを行う際の考慮点